﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace INSTA.Concepts.CreateEvents
{
    
    // STEP 1 :
    // Avant de déclarer un event dans la classe, il nous 
    // faut déclarer un nouveau delegate, qui va définir
    // la signature qu'auront les procédures qui vont 
    // traiter l'event.
    //public delegate void NameChangedDelegate(object sender, PersonEventArgs e);



    /// <summary>
    /// Represents a Person
    /// </summary>
    public class Person
    {
    
        // STEP 2 :
        // On déclare dans la classe un nouvel event, dont la signature
        // est définie par la signature du delegate "NameChangedDelegate".
        //
        //            Type de l'event     Nom de l'event.  
        //              |                   |
        //public event NameChangedDelegate NameChanged;

        public event EventHandler<PersonEventArgs> NameChanged;



        private string _name;


        /// <summary>
        /// Gets or sets the name.
        /// </summary>
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                
                // On appelle la procédure qui déclenche l'event.
                OnNameChanged();
            }
        }

        protected virtual void OnNameChanged()
        {
            // STEP 3 
            // On déclenche l'event, mais auparavant, il nous faut 
            // vérifier qu'il existe bien au moins une procédure abonnée
            // à notre event, sans quoi une Exception sera levée..
            // On fait cette vérification en comparant l'event à null.

            // S'il exite bien une ou plusieurs procédures abonnées
            // à notre event..
            if (NameChanged != null)
            {
                // Déclenchement effectif de l'event
                NameChanged(this, new PersonEventArgs(_name, FirstName));
            }
        }

        /// <summary>
        /// Gets or sets the first name.
        /// </summary>
        public string FirstName { get; set; }

        /// <summary>
        /// Gets or sets the year of birth.
        /// </summary>
        public int YearOfBirth  { get; set; }

    }
}
